package com.doubao.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.doubao.common.result.Result;
import com.doubao.user.entity.MembershipLevel;
import com.doubao.user.entity.UserMembership;
import com.doubao.user.dto.MembershipDTO;

import java.util.List;

/**
 * 会员服务接口
 */
public interface MembershipService {

    /**
     * 获取所有会员等级
     *
     * @return 会员等级列表
     */
    Result<List<MembershipLevel>> getAllLevels();

    /**
     * 获取指定会员等级
     *
     * @param levelId 会员等级ID
     * @return 会员等级
     */
    Result<MembershipLevel> getLevelById(Integer levelId);

    /**
     * 获取会员详情
     *
     * @param userId 用户ID
     * @return 会员详情
     */
    Result<MembershipDTO> getUserMembership(Long userId);

    /**
     * 创建会员
     *
     * @param userId 用户ID
     * @param levelId 会员等级ID
     * @param subscriptionType 订阅类型
     * @param days 有效天数
     * @param source 来源
     * @param orderId 订单ID
     * @return 结果
     */
    Result<Void> createMembership(Long userId, Integer levelId, String subscriptionType,
                                  Integer days, String source, String orderId);

    /**
     * 更新会员等级
     *
     * @param userId 用户ID
     * @param levelId 会员等级ID
     * @param subscriptionType 订阅类型
     * @param days 有效天数
     * @param source 来源
     * @return 结果
     */
    Result<Void> updateMembershipLevel(Long userId, Integer levelId, String subscriptionType,
                                       Integer days, String source);

    /**
     * 续费会员
     *
     * @param userId 用户ID
     * @param days 延长天数
     * @param source 来源
     * @param orderId 订单ID
     * @return 结果
     */
    Result<Void> renewMembership(Long userId, Integer days, String source, String orderId);

    /**
     * 每日刷新会员token
     *
     * @param userId 用户ID
     * @return 结果
     */
    Result<Void> refreshDailyTokens(Long userId);

    /**
     * 消费聊天次数
     *
     * @param userId 用户ID
     * @return 结果，如果消费失败返回原因
     */
    Result<Void> consumeChatCount(Long userId);

    /**
     * 消费切换智能体次数
     *
     * @param userId 用户ID
     * @return 结果，如果消费失败返回原因
     */
    Result<Void> consumeSwitchCount(Long userId);

    /**
     * 检查是否是会员
     *
     * @param userId 用户ID
     * @return 是否是会员
     */
    boolean isVipMember(Long userId);

    /**
     * 检查用户聊天次数是否充足
     *
     * @param userId 用户ID
     * @return 结果
     */
    boolean hasSufficientChatCount(Long userId);

    /**
     * 检查用户切换智能体次数是否充足
     *
     * @param userId 用户ID
     * @return 结果
     */
    boolean hasSufficientSwitchCount(Long userId);

    /**
     * 获取会员剩余聊天次数
     *
     * @param userId 用户ID
     * @return 剩余次数
     */
    int getRemainingChatCount(Long userId);

    /**
     * 获取会员剩余切换智能体次数
     *
     * @param userId 用户ID
     * @return 剩余次数
     */
    int getRemainingSwitchCount(Long userId);
}